package com.daxia.bumall.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.daxia.bumall.dao.ApiTestDAO;
import com.daxia.bumall.dao.ApiTestParameterDAO;
import com.daxia.bumall.dto.ApiTestDTO;
import com.daxia.bumall.model.ApiTest;
import com.daxia.bumall.model.ApiTestParameter;
import com.daxia.bumall.support.Page;
import com.daxia.bumall.util.BeanMapper;

@Service
public class ApiTestService {
	
	@Autowired
	private ApiTestDAO apiTestDAO;
	
	@Autowired
	private ApiTestParameterDAO apiTestParameterDAO;
	public List<ApiTestDTO> find(ApiTestDTO query, Page page) {
		List<ApiTest> models = apiTestDAO.find(query, page);
		List<ApiTestDTO> dtos = toDTOs(models);
		return dtos;
	}
	
	public List<ApiTestDTO> findAll() {
		return this.find(new ApiTestDTO(), null);
	}
	
	public List<ApiTestDTO> find(int count) {
		Page page = new Page();
		page.setPage(1);
		page.setPageSize(count);
		return this.find(new ApiTestDTO(), page);
	}
	
	public Long create(ApiTestDTO dto) {
		ApiTest model = new ApiTest();
		toModel(model, dto);
		return apiTestDAO.create(model);
	}
	
	public ApiTestDTO load(Long id) {
	    ApiTest model = apiTestDAO.load(id);
	    return toDTO(model);
    }

	public void updateAllFields(ApiTestDTO dto) {
		ApiTest model = apiTestDAO.load(dto.getId());
		toModel(model, dto);
		apiTestDAO.update(model);
    }

	public void deleteByIds(Long[] ids) {
		if (ids != null) {
			for (Long id : ids) {
				apiTestDAO.deleteById(id);
			}
		}
    }
	
	public void deleteById(Long id) {
		this.deleteByIds(new Long[] {id});
	}

	public ApiTestDTO findOne(ApiTestDTO query) {
		ApiTest model = apiTestDAO.findOne(query);
		return toDTO(model);
	}
	
	private List<ApiTestDTO> toDTOs(List<ApiTest> models) {
		if (CollectionUtils.isEmpty(models)) {
			return new ArrayList<ApiTestDTO>(0);
		}
		List<ApiTestDTO> dtos = new ArrayList<ApiTestDTO>(models.size());
		for (ApiTest model : models) {
	        ApiTestDTO dto = toDTO(model);
	        dtos.add(dto);
        }
	    return dtos;
    }
    
    private ApiTestDTO toDTO(ApiTest model) {
		if (model == null) {
			return null;
		}
		ApiTestDTO dto = BeanMapper.map(model, ApiTestDTO.class);
		
		return dto;
	}
	
	private void toModel(ApiTest model, ApiTestDTO dto) {
		BeanMapper.copy(dto, model);
    }
	
	@SuppressWarnings("unused")
	private List<ApiTest> toModels(List<ApiTestDTO> dtos) {
		if (CollectionUtils.isEmpty(dtos)) {
			return new ArrayList<ApiTest>(0);
		}
		List<ApiTest> models = new ArrayList<ApiTest>(dtos.size());
		for (ApiTestDTO dto : dtos) {
	        ApiTest model = new ApiTest();
	        toModel(model, dto);
	        models.add(model);
        }
		return models;
	}
	
	public void create(ApiTestDTO dto, List<ApiTestParameter> parameters) {
        Long id = this.create(dto);
        ApiTest model = apiTestDAO.load(id);
        for (ApiTestParameter apiTestParameter : parameters) {
            apiTestParameter.setApiTest(model);
            apiTestParameterDAO.create(apiTestParameter);
        }
    }
	

	public void updateAllFields(ApiTestDTO dto, List<ApiTestParameter> parameters) {
        this.updateAllFields(dto);
        apiTestParameterDAO.deleteByApiTestId(dto.getId());
        
        ApiTest model = apiTestDAO.load(dto.getId());
        for (ApiTestParameter apiTestParameter : parameters) {
            apiTestParameter.setApiTest(model);
            apiTestParameterDAO.create(apiTestParameter);
        }
    }
}
